﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AudiPyme.DAL;

namespace AudiPyme.BLL
{
    //Clase Auxiliar para bindear los activos de una empresa a gridviews con literales
    public class ActivoConsultaAux
    {

        int idActivo;
        String tipoActivo;
        String nombre;
        String descripcion;
        int costeActivo;
        String valorEstrategico;


        public ActivoConsultaAux()
        {
            idActivo = 0;
            tipoActivo = "";
            nombre = "";
            descripcion = "";
            costeActivo = 0;
            valorEstrategico = "";

        }
        public ActivoConsultaAux(int IdActivo, String TipoActivo, String Nombre, String Descripcion, int CosteActivo, String ValorEstrategico)
        {
            idActivo = IdActivo;
            tipoActivo = TipoActivo;
            nombre = Nombre;
            descripcion = Descripcion;
            costeActivo = CosteActivo;
            valorEstrategico = ValorEstrategico;
        }

        public int IdActivo
        {
            get { return idActivo; }
            set { idActivo = value; }
        }

        public String TipoActivo
        {
            get { return tipoActivo; }
            set { tipoActivo = value; }
        }

        public String Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }


        public String Descripcion
        {
            get { return descripcion; }
            set { descripcion = value; }
        }

        public int CosteActivo
        {
            get { return costeActivo; }
            set { costeActivo = value; }
        }
        public String ValorEstrategico
        {
            get { return valorEstrategico; }
            set { valorEstrategico = value; }
        }

        public static string MapeaValoresActivo(int IdValorEstrategic)
        {
            switch (IdValorEstrategic)
            {
                case 1:
                    return "Bajo";
                case 2:
                    return "Medio";
                case 3:
                    return "Alto";
                default:
                    return "";
            }
        }

        //Método que devuelve los activos de una empresa formateados para mostrar en el GridView
        public static List<ActivoConsultaAux> ActivosEmpresaTabla(int IdEmpresa)
        {
            List<ActivoConsultaAux> LActivos = new List<ActivoConsultaAux>();
            ModeloContainer agenteBD = new ModeloContainer();
            //Se recogen los activos que estén actualmente disponibles en la empresa
            var activos = (from a in agenteBD.ActivosEmpresaEstablecer
                           join t in agenteBD.TiposActivosEstablecer on a.IdTipoActivo equals t.IdTipoActivo
                           where a.IdEmpresa == IdEmpresa && a.Actual == true
                           select new { a.IdActivo, a.Nombre, t.TipoActivo, a.Descripcion, a.CosteActivo, a.ValorEstrategico }).Distinct().OrderBy(i => i.IdActivo);
            //Por cada activo se crea un elemento ActivoConsultaAux y se añade a la lista
            foreach (var ac in activos)
            {
                ActivoConsultaAux NuevoElemento = new ActivoConsultaAux();
                NuevoElemento.IdActivo = ac.IdActivo;
                NuevoElemento.Nombre = ac.Nombre;
                NuevoElemento.TipoActivo = ac.TipoActivo;
                NuevoElemento.Descripcion = ac.Descripcion;
                NuevoElemento.CosteActivo = ac.CosteActivo;
                NuevoElemento.ValorEstrategico = MapeaValoresActivo(ac.ValorEstrategico);
                LActivos.Add(NuevoElemento);
            }
            return LActivos;
        }

        //Método que devuelve los activos de una empresa cuyo nombre de activo coincide con el patrón de textobuscar introducido
        public static List<ActivoConsultaAux> ActivosEmpresaTablaPorNombre(String TextoBuscar, int IdEmpresa)
        {
            List<ActivoConsultaAux> LActivos = new List<ActivoConsultaAux>();
            ModeloContainer agenteBD = new ModeloContainer();
            var activos = (from a in agenteBD.ActivosEmpresaEstablecer
                           join t in agenteBD.TiposActivosEstablecer on a.IdTipoActivo equals t.IdTipoActivo
                           where a.IdEmpresa == IdEmpresa && a.Actual == true && a.Nombre.Contains(TextoBuscar)
                           select a).Distinct().OrderBy(i => i.IdActivo);
            foreach (var ac in activos)
            {
                ActivoConsultaAux NuevoElemento = new ActivoConsultaAux();
                NuevoElemento.IdActivo = ac.IdActivo;
                NuevoElemento.Nombre = ac.Nombre;
                NuevoElemento.TipoActivo = TiposActivosFactory.RecogeNombreTipoActivo(ac.IdTipoActivo);
                NuevoElemento.Descripcion = ac.Descripcion;
                NuevoElemento.CosteActivo = ac.CosteActivo;
                NuevoElemento.ValorEstrategico = MapeaValoresActivo(ac.ValorEstrategico);
                LActivos.Add(NuevoElemento);
            }
            return LActivos;
        }

        //Método que devuelve los activos de una empresa cuyos tipos de activos coinciden con el patrón de textobuscar introducido
        public static List<ActivoConsultaAux> ActivosEmpresaTablaPorTipoActivo(String TextoBuscar, int IdEmpresa)
        {
            List<ActivoConsultaAux> LActivos = new List<ActivoConsultaAux>();
            ModeloContainer agenteBD = new ModeloContainer();
            var activos = (from a in agenteBD.ActivosEmpresaEstablecer
                           join t in agenteBD.TiposActivosEstablecer on a.IdTipoActivo equals t.IdTipoActivo
                           where a.IdEmpresa == IdEmpresa && a.Actual == true && t.TipoActivo.Contains(TextoBuscar)
                           select a).Distinct().OrderBy(i => i.IdActivo);
            foreach (var ac in activos)
            {
                ActivoConsultaAux NuevoElemento = new ActivoConsultaAux();
                NuevoElemento.IdActivo = ac.IdActivo;
                NuevoElemento.Nombre = ac.Nombre;
                NuevoElemento.TipoActivo = TiposActivosFactory.RecogeNombreTipoActivo(ac.IdTipoActivo);
                NuevoElemento.Descripcion = ac.Descripcion;
                NuevoElemento.CosteActivo = ac.CosteActivo;
                NuevoElemento.ValorEstrategico = MapeaValoresActivo(ac.ValorEstrategico);
                LActivos.Add(NuevoElemento);
            }
            return LActivos;
        }

        //Método que convierte los valores almacenados en la columna ValorEstrategico de ActivosEmpresa
        //en String. A saber: 1=Bajo, 2=Medio, 3=Alto
        public static List<ActivoConsultaAux> RellenaValoresActivo(IQueryable<ActivosEmpresa> ActivosEmpresa)
        {
            List<ActivoConsultaAux> ListActivosAux = new List<ActivoConsultaAux>();
            foreach (ActivosEmpresa Activo in ActivosEmpresa)
            {
                ActivoConsultaAux nuevoActivo = new ActivoConsultaAux();
                nuevoActivo.IdActivo = Activo.IdActivo;
                nuevoActivo.Nombre = Activo.Nombre;
                nuevoActivo.CosteActivo = Activo.CosteActivo;
                nuevoActivo.ValorEstrategico = MapeaValoresActivo(Activo.ValorEstrategico);
                ListActivosAux.Add(nuevoActivo);
            }
            return ListActivosAux;
        }

    }
}
